perm filename BORDER.SAI[PIC,HE] blob sn#430354 filedate 1979-04-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY ICASEV,JCASEV,BDRPRE,BDRPOST,BORDER
C00007 ENDMK
C⊗;
ENTRY ICASEV,JCASEV,BDRPRE,BDRPOST,BORDER;
BEGIN "BORDER"
REQUIRE "BUFDEC" SOURCE!FILE;
SIMPLE INTERNAL INTEGER PROCEDURE ICASEV(INTEGER INX);
    RETURN(CASE INX OF (0,-1,-1,-1,0,1,1,1));
SIMPLE INTERNAL INTEGER PROCEDURE JCASEV(INTEGER INX);
    RETURN(CASE INX OF (1,1,0,-1,-1,-1,0,1));
SIMPLE INTERNAL INTEGER PROCEDURE BDRPRE(REFERENCE INTEGER N; INTEGER I,J,ibuf,RWS,COLS; SAFE INTEGER ARRAY NEIGHBORS);
    BEGIN "BDRPRE"
    INTEGER IIND,JIND,M;
    FOR M←0 THRU 7 DO
	BEGIN "LOAD1"
	IIND←I+ICASEV(M);
	JIND←J+JCASEV(M);
	IF 1≤IIND≤RWS AND 1≤JIND≤COLS
	    THEN NEIGHBORS[M]←GETPNT(IIND,JIND,IBUF)
	    ELSE NEIGHBORS[M]←0;
	END "LOAD1";
    FOR N←0 STEP 1 WHILE N<8 AND NEIGHBORS[N] DO;
    IF N>7
	THEN BEGIN
	    PRINT("BAD STARTING POINT",CRLF);
	    RETURN(0);
	    END;
    FOR N←N+1 THRU 7 DO
	IF NEIGHBORS[N] THEN DONE;
    IF N=8 AND NOT NEIGHBORS[N←0] THEN RETURN(-1);			! A SINGLE POINT;
    RETURN(1);
    END "BDRPRE";

SIMPLE INTERNAL PROCEDURE BDRPOST(REFERENCE INTEGER N,ST,TEMP;
	INTEGER I,J,IBUF,RWS,COLS; SAFE INTEGER ARRAY NEIGHBORS);
    BEGIN "BDRPOST"
    INTEGER IIND,JIND,M;
    ST←IF (TEMP LAND 1)
	THEN IF (TEMP←TEMP-3)<0 THEN 8+TEMP
			ELSE TEMP
	  ELSE IF (TEMP←TEMP-2)<0 THEN 8+TEMP
			ELSE TEMP;
    N←0;
    FOR M←0 THRU 7 DO
	BEGIN
	TEMP←(M+ST) MOD 8;
	IIND←I+ICASEV(TEMP);
	JIND←J+JCASEV(TEMP);
	IF 1≤IIND≤RWS AND 1≤JIND≤COLS
	    THEN BEGIN
		IF (NEIGHBORS[M]←GETPNT(IIND,JIND,IBUF)) AND NOT N THEN N←M;
		END
	    ELSE NEIGHBORS[M]←0;
	END;
    END "BDRPOST";

INTERNAL integer PROCEDURE BORDER(INTEGER II,JJ,IBUF,OBUF; REFERENCE INTEGER IMIN,IMAX,JMIN,JMAX; integer value);
	BEGIN "BORDERFOLLOW"
	SAFE INTEGER ARRAY NEIGHBORS[0:7];
	INTEGER REGNUM,K,L,M,N,INITI,INITJ,P,OLDVAL,RWS,COLS,I,J,ST,TEMP,IIND,JIND,numpt,val,offi,offj,noput,ckout;

	ckout←0;
	RWS←ROWS(IBUF);  COLS←COLMS(IBUF);
	I←INITI←II;  J←INITJ←JJ;
	ST←0;
	offi←isubst(ibuf)-isubst(obuf);
	offj←jsubst(ibuf)-jsubst(obuf);
	val←if value<-1 then -value else value;
	noput←if ibuf=obuf ∧ bytsz(ibuf)=1 then -1 else 0;

	numpt←0;
	IF (DUM←BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS))≤0 THEN RETURN(DUM);

	WHILE TRUE DO
		BEGIN "LOOP"
		TEMP←(N+ST) MOD 8;
		I←I+ICASEV(TEMP);
		J←J+JCASEV(TEMP);
		if ckout then if ((val=0) or getpnt(i+offi,j+offj,obuf)) then return(numpt) else ckout←0;
		if value>0 ∧ (dum←getpnt(i+offi,j+offj,obuf)) then if dum≠value then return(0);
		if ¬noput then PUTPNT(I+offi,J+offj,val,OBUF);
		numpt←numpt+1;
		IF I<IMIN THEN IMIN←I
		ELSE IF I>IMAX THEN IMAX←I;
		IF J<JMIN THEN JMIN←J
		ELSE IF J>JMAX THEN JMAX←J;
		IF I=INITI AND J=INITJ THEN ckout←-1;
		BDRPOST(N,ST,TEMP,I,J,IBUF,RWS,COLS,NEIGHBORS);
		END "LOOP";

	END "BORDERFOLLOW";
END "BORDER"